package commonclass.stringclass;


import org.junit.jupiter.api.Test;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-03 10:36
 * @description
 */
public class StringTest {
    /**
     * String：字符串，使用一对”引起来表示
     * 1，String为final不可被继承
     * 2.String实现了Serializable接口：表示字符串支持序列化
     *              Comparable接口：表示String可以比较大小。
     * 3.String内部定义了final char[] value用于存储字符串数据
     * 4.String：代表不可变的字符序列，简称：不可变性。
     *      体现：1.当对字符串重新赋值时，需要重新指定内存存储区，不能在原处赋值
     *           2.当现有字符串进行连接操作时，也需要重新创建新的内存区域
     *           3.调用String的replace修改字符或字符串时，仍需要重新指定内存区域
     * 5.通过字面量的方式（区别于new）给一个字符串赋值，此时的字符串值声明在字符串常量池中。
     * 6.字符串常量池中是不会存储相同内容的字符串的。
     *
     */

    @Test
    public void test1(){
        String s1="abc";//字面量
        String s2="abc";
        s1="hello";
        String s3=s1.replace('l','p');
        System.out.println(s1==s2);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }

    /**
     * 字符串实例化方式
     * 1.通过字面量定义
     * 2.通过new+构造器
     *
     * 面试：String s=new String("abc")，内存中创建了几个对象？
     *      2个，一个是堆空间的new结构，另一个时char[]对应的常量池中的数据“abc”
     *
     *
     */

    @Test
    public void test2(){
        //字面量
        String s1="javaEE";
        String s2="javaEE";
        //new+构造器
        String s3=new String("javaEE");
        String s4=new String("javaEE");
        System.out.println(s1==s3);
        System.out.println(s3==s4);
    }

    /**
     * 字面量在常量池开辟空间
     * 赋值后有变量名参与了，都需要在堆空间开辟，而不是在常量池
     * 调用intern()后，会变成在常量池中
     */

    @Test
    public void test3(){
        //字面量在常量池开辟空间
        String s1="javaEE";
        String s2="hadoop";
        String s3="javaEEhadoop";
        String s4="javaEE"+"hadoop";
        //赋值后有变量名参与了，都需要在堆空间开辟，而不是在常量池
        String s5=s1+"hadoop";
        String s6="javaEE"+s2;
        String s7=s1+s2;

        String s8=s5.intern();//返回值得到的s8使用常量池中已经存在的值

        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s3==s6);//false
        System.out.println(s5==s6);//false
        System.out.println(s5==s7);//false
        System.out.println(s6==s7);//false
        System.out.println(s3==s8);//true
    }

}
